<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>11.使用命名规则保护属性</title>
</head>
<body>
  
</body>
<script>
  //设置对象的私有属性有多种方式，包括后面章节介绍的模块封装。
    /*
    1. public 指不受保护的属性，在类的内部与外部都可以访问到 
    2. protected是受保护的属性修释，不允许外部直接操作，但可以继承后在类内部访问，有以下几种方式定义
      1. 将属性定义为以 _ 开始，来告诉使用者这是一个私有属性，请不要在外部使用
         - 外部修改私有属性时可以使用访问器 setter 操作
         - 但这只是提示，就像吸烟时烟盒上的吸烟有害健康，但还是可以抽的
      2. 使用 Symbol定义私有访问属性，即在外部通过查看对象结构无法获取的属性
      3. 利用WeakMap类型特性定义私有属性   
    3. private 指私有属性，只在当前类可以访问到，并且不允许继承使用
    */



    class User {
      // public
      _url = "houdunren.com";
      constructor(name) {
        this.name = name;
      }

      set url (url) {
        if (!/^https?:/i.test(url)) {
          throw new Error("非常网址");
        }
        this._url = url;
      }
      get url () {
        return this._url;
      }
    }
    let hd = new User("后盾人");
    hd.url = "https://houdurnen.com"
    console.log(hd.name, hd.url);
</script>
</html>